package Streaming;

import java.util.Random;
import java.util.stream.Stream;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/6 6:46
 * @Version 1.0
 * Stream 的运行机制
 * 结论：
 * 1. 所有操作是链式调用，一个元素只迭代一次（也就是一个元素执行完peek和filter 再执行下一个peek和filter。并不是执行完所有的peek再执行所有的filter）
 * 2. 每一个中间操作返回一个新的流，流里面有一个属性sourceStage指向同一个地方，就是我们链表的头，就是head
 * 3. Head -> nextStage -> nextStage ... -> nextStage -> null (一直指向空)
 * 4. 有状态操作会把无状态操作 截断，单独处理
 * 5. 并行环境下，有状态的中间操作 不一定能并行操作（是在单独一个线程里面执行的）
 * 6. parallel/sequetial 这两个操作也是中间操作（也是返回stream流） 但是他们不创建流，他们只修改Head的并行标准
 */
public class RunStream {
    public static void main(String[] args) {
        Random random = new Random();
        Stream<Integer> stream = Stream.generate(() -> random.nextInt())
                .limit(500)
                //第一个无状态操作
                .peek(s -> print("peek" + s))
                //第二个无状态操作
                .filter(s -> {
                    print("filter:" + s);
                    return s > 1000000;
                })
                // 有状态操作
                .sorted((i1, i2) -> {
                    print("排序：" + i1 + "," + i2);
                    return i1.compareTo(i2);
                })
                //又一个无状态操作
                .peek(s -> {
                            print("peek2:" + s);
                        }
                )
                .parallel()
                ;
        //终止操作
        stream.count();

    }
    public static void print(String s){
        System.out.print(Thread.currentThread().getName()+">");
        System.out.println(s);
    }

}
